//
//  WQHomeController.swift
//  sanwuWeibo
//
//  Created by 王先强 on 15/12/6.
//  Copyright © 2015年 王先强. All rights reserved.
//

import UIKit

let homeCell = "homeCell"
let homeStatusRetweetedCellID = "homeStatusRetweetedCellID"
let homeStatusNormalCellID = "homeStatusNormalCellID"

class WQHomeController: WQVisitorController {
    
    // 懒加载转场动画代理
    lazy var photosBrowserAnimatorDelegate: WQPhotosBrowserAnimator = WQPhotosBrowserAnimator()
    //微博模型数组
    lazy var statusNetViewModel = WQStatusNetViewModel()
    //判断是否正在进行上拉刷新
    var isPullupRefreshing = false
    override func viewDidLoad() {
        super.viewDidLoad()
        if !WQAccountViewModel.sharedAccount.isLogin {
             visitorView?.setupVisitorViewInfo(nil, infoString: "关注一些人，回这里看看有什么惊喜")
            return
        }
        //加载网络数据
        prepareUI()
        loadData()
        // 绑定通知监听器
        WQNotificationCenter.addObserverForName(WQPictureViewSelectedImageNotification, object: nil, queue: nil) {[weak self] (notification) -> Void in
//            print(notification)
            ///  进入图片浏览器控制器
            guard let indexPath = notification.userInfo?[WQPictureViewIndexPathKey] as? NSIndexPath else {
                return
            }
            guard let URLs = notification.userInfo?[WQPictureViewURLsKey] as? [NSURL] else {
                return
            }
            guard let cell = notification.object as? WQPhotosBrowserAnimatorPresentDelegate else {
                return
            }
           /****************************** 自定义转场动画设置 ******************************/
            
            let photoBrowserVC = WQPhotosBrowserController(selectIndexPath: indexPath, photoURLs: URLs)
            //1.设置modal控制的样式为自定义

            photoBrowserVC.modalPresentationStyle = UIModalPresentationStyle.Custom
            //2.设置转场动画的代理属性
            photoBrowserVC.transitioningDelegate = self?.photosBrowserAnimatorDelegate
            self?.photosBrowserAnimatorDelegate.setDelegatePramas(cell, dismissDelegate: photoBrowserVC, indexPath: indexPath)
            self?.presentViewController(photoBrowserVC, animated: true, completion: nil)
        }
    }
    
}


extension WQHomeController {
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statusNetViewModel.statusList.count
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let statusViewModel = statusNetViewModel.statusList[indexPath.row]
        if indexPath.row == statusNetViewModel.statusList.count - 1 {
            upLoadData()
        }
        let cell = tableView.dequeueReusableCellWithIdentifier(statusViewModel.cellID, forIndexPath: indexPath) as? WQHomeCell
        cell?.statusViewModel = statusViewModel
        return cell!
    }
    
    /**
     行高
     
     -- 设置了预估行高
     * 当前显示的行高方法会调用三次（每个版本的Xcode调用次数可能不同）
     
     问题：预估行高如果不同，计算的次数不同！
     
     1. 使用预估行高，计算出预估的 contentSize
     2. 根据预估行高，判断计算次数，顺序计算每一行的行高，更新 contentSize
     3. 如果预估行高过大，超出预估范围，顺序计算后续行高，一直到填满屏幕退出，同时更新 contentSize
     4. 使用预估行高，每个 cell 的显示前需要计算，单个 cell 的效率是低的，从整体效率高！
     
     执行顺序 行数 -> 每个[cell -> 行高]
     
     预估行高：尽量靠近！
     
     -- 没设置了预估行高
     * 1. 计算所有行的高度
     * 2. 再计算显示行的高度
     
     执行顺序 行数 -> 行高 -> cell
     
     问题：为什么要调用所有行高方法？UITableView 继承自 UIScrollView
     表格视图滚动非常流畅 -> 需要提前计算出 contentSize
     
     苹果官方文档有指出，如果行高是固定值，就不要实现行高代理方法！
     
     实际开发中，行高一定要缓存！
     */
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return statusNetViewModel.statusList[indexPath.item].rowHeight
    }
    
    

}

extension WQHomeController {
    
    private func prepareUI(){
        tableView.registerClass(WQStatusNormalCell.classForCoder(), forCellReuseIdentifier: homeStatusNormalCellID)
        tableView.registerClass(WQStatusRetweetedCell.classForCoder(), forCellReuseIdentifier: homeStatusRetweetedCellID)
        // 自动计算行高 - 需要一个自上而下的自动布局的控件，指定一个向下的约束
        tableView.estimatedRowHeight = 300
        tableView.separatorStyle = .None
        
        refreshControl = WQRefreshControl()
        refreshControl?.hidden = true
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)

    }
    
    
///  加载网络数据方法－下拉刷新
    @objc private func loadData() {
        self.refreshControl?.beginRefreshing()
        self.statusNetViewModel.loadDownRefreshStatus { (isSuccess) -> () in
            
            if isSuccess {
                self.tableView.reloadData()
                self.refreshControl?.endRefreshing()
            }
        }
    }
    
    //上拉
    private func upLoadData() {
        if isPullupRefreshing {
            return
        }
        isPullupRefreshing = true
        self.statusNetViewModel.loadUpRefreshStatus { (isSuccess) -> () in
            if isSuccess {
                self.tableView.reloadData()
                self.isPullupRefreshing = false
            }
        }
    }
}